package com.hq.zb.controller;


import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.hq.zb.dto.RoleDto;
import com.hq.zb.entity.CurrentUser;
import com.hq.zb.mapper.RoleUserMapper;
import com.hq.zb.model.Role;
import com.hq.zb.service.IRoleMenuService;
import com.hq.zb.service.IRoleService;
import com.hq.zb.service.IRoleUserService;
import com.hq.zb.utils.ContextHolderUtils;
import com.hq.zb.utils.Result;
import com.hq.zb.vo.RoleVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 角色表 前端控制器
 * </p>
 *
 * @author huanghanrui
 * @since 2022-03-07
 */
@RestController
@RequestMapping("/sys")
public class RoleController {

    @Autowired
    private IRoleService roleService;

    @Autowired
    private IRoleMenuService roleMenuService;

    @Autowired
    private IRoleUserService roleUserService;

    /**
     * 分页查询角色
     * @param roleDto 角色
     * @param pageNum 当前页
     * @param pageSize 页大小
     * @return
     */
    @PostMapping("/role/query")
    @ResponseBody
    public Result queryRole(@RequestBody RoleDto roleDto, int pageNum, int pageSize) {
        //获取当前登陆用户信息
        CurrentUser currentUser = ContextHolderUtils.getCurrentUser();
        Wrapper<RoleVo> wrapper = new EntityWrapper<>();
        wrapper.eq("t.delete_flag", false);
        wrapper.like("t.role_name", roleDto.getRoleName());
        wrapper.like("t.sys_source", roleDto.getSysSource());
        wrapper.like("t.org_code", roleDto.getOrgCode());
        wrapper.like("t.dept_code", roleDto.getDeptCode());
        //过滤超级管理员的
        wrapper.notIn("t.role_name", "超级管理员");
        //除了超级管理员，其他用户都是只能看到自己的组织或者下属组织的部门信息
        if (StringUtils.isNotBlank(currentUser.getRoles()) ||
                (StringUtils.isNotBlank(currentUser.getRoles()) && currentUser.getRoles().indexOf("超级管理员")  < 0) ) {
            wrapper.like("org_code", currentUser.getDeptCode());
        }
        Page<RoleVo> page = new Page<>(pageNum, pageSize);
        Page<RoleVo> list = roleService.queryRolePage(page, wrapper);
        return Result.data(list);
    }

    /**
     * 保存角色
     * @param role
     * @return
     */
    @PostMapping("/role/save")
    public Result saveRole(@RequestBody Role role) {
        roleService.saveRole(role);
        return Result.ok();
    }

    /**
     * 删除角色
     * @param roles
     * @return
     */
    @PostMapping("/role/delete")
    public Result deleteRole(@RequestBody List<Role> roles) {
        roleService.deleteRole(roles);
        return Result.ok();
    }

    /**
     * 分配角色菜单
     * @param roleDto
     * @return
     */
    @PostMapping("/role/menu/assign")
    public Result assignRoleMenu(@RequestBody RoleDto roleDto) {
        roleMenuService.assignRoleMenu(roleDto);
        return Result.ok();
    }

    /**
     * 查询角色菜单ID集合
     * @return
     */
    @PostMapping("/role/menu/query")
    @ResponseBody
    public Result queryByRoleCode(@RequestBody RoleDto roleDto) {
        return Result.data(roleMenuService.queryByRoleCode(roleDto));
    }

    /**
     * 分配角色用户
     * @param roleDto
     * @return
     */
    @PostMapping("/role/user/assign")
    public Result assignRoleUser(@RequestBody RoleDto roleDto) {
        roleUserService.assignRoleUser(roleDto);
        return Result.ok();
    }
}

